/**   
 * @Title: UserManager.java 
 * @Package: com.rename.icode.manager 
 * @Description: Administrator版权所有
 * @author Administrator  
 * @date 2015-3-10 上午10:39:13 
 * @version  
 */

package com.rename.icode.manager;

import android.net.ParseException;
import android.os.Environment;

import com.rename.icode.comm.Constants;
import com.rename.icode.model.CodeFile;
import com.rename.icode.model.User;
import com.rename.icode.task.LoginTask;
import com.rename.icode.utils.FileUtil;
import com.rename.icode.utils.HttpURLTools;
import com.rename.icode.utils.LogUtil;

import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description 实现了...功能
 * @author Administrator
 * @date 2015-3-10 上午10:39:13
 * @version V1.0
 */

public class UserManager {

	private static final String TAG = "UserManager";

	private User user;

	public UserManager() {
		user = new User();
	}

	static class Loader {
		static final UserManager INSTANCE = new UserManager();
	}

	public static UserManager getInstance() {
		return Loader.INSTANCE;
	}

	public void init(String userInfo) {
		LogUtil.i(TAG, "UserManager init...");

		// 读取sdcard中的文件信息
		refreshLocalData();
		// 获取服务器端用户信息
		refreshSeverData(userInfo);
		// 创建数据库
	}
	
	public void init() { // guest登录
		LogUtil.i(TAG, "UserManager init...");

		// 读取sdcard中的文件信息
		refreshLocalData();
		// 获取服务器端用户信息
		user.setServerData(new ArrayList<CodeFile>());
		// 创建数据库
	}

	public User getUser() {
		if (null == user) {
			LogUtil.i(TAG, "user init fail");
		}
		return user;
	}

	/**
	 * 
	 * @Description 获取sdcard中的本地文件名
	 * @author Administrator
	 * @return
	 */
	private List<String> getLocalFileNames(String fileDir) {
		File[] files = FileUtil.getFiles(fileDir);
		List<String> fileNames = null;
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				fileNames.add(files[i].getName());
			}
		}
		return fileNames;
	}

	/**
	 * 
	 * @Description 把文件转换成CodeFile对象
	 * @author Administrator
	 */
	// private List<CodeFile> readFilesToCodeFiles(File[] files, String type) {
	// List<File> fileList = new ArrayList<File>();
	// fileList = sort(files);// 给文件排序
	// List<CodeFile> codeFiles = new ArrayList<CodeFile>();
	// int i = 0;
	// for (File file : fileList) {
	// CodeFile codeFile = new CodeFile();
	// codeFile.setId(String.valueOf(file.lastModified()));
	// codeFile.setName(file.getName());
	// codeFile.setDetail(String.valueOf(file.lastModified()));
	// codeFile.setOrderNumber(i);
	// codeFile.setType(type);// 注释
	// codeFiles.add(codeFile);
	// i++;
	// LogUtil.i(TAG, "codefile: " + codeFile.toString());
	// }
	// return codeFiles;
	// }

	private List<CodeFile> readFilesToCodeFiles(File[] files, String type) {
		List<File> fileList = new ArrayList<File>();
		List<CodeFile> codeFiles = new ArrayList<CodeFile>();
		List<CodeFile> codefilesc = new ArrayList<CodeFile>();
		List<CodeFile> codeFilescpp = new ArrayList<CodeFile>();
		List<CodeFile> codeFilessjava = new ArrayList<CodeFile>();
		int i = 0;
		for (File file : fileList) {
			CodeFile codeFile = new CodeFile();
			codeFile.setId(String.valueOf(file.lastModified()));
			codeFile.setName(file.getName());
			codeFile.setDetail(String.valueOf(file.lastModified()));
			// codeFile.setOrderNumber(i);
			codeFile.setType(type);// 注释
			if (file.getName().endsWith(".c")) {
				codeFile.setType(Constants.TYPE_C);
				codefilesc.add(codeFile);
			} else if (file.getName().endsWith(".cpp")) {
				codeFile.setType(Constants.TYPE_CPP);
				codeFilescpp.add(codeFile);
			} else if (file.getName().endsWith(".java")) {
				codeFile.setType(Constants.TYPE_JAVA);
				codeFilessjava.add(codeFile);
			}
			codeFiles.add(codeFile);
			i++;
			LogUtil.i(TAG, "codefile: " + codeFile.toString());
		}
		return codeFiles;
	}

	/**
	 * 
	 * @Description 根据文件名对文件排序,文件名首字母升序
	 * @author Administrator
	 * @return
	 */
	private List<File> sort(File[] files) {
		List<File> fileList = new ArrayList<File>();
		for (File file : files) {
			fileList.add(file);
		}
		Comparator<Object> comparator = new Comparator<Object>() {

			@Override
			public int compare(Object lhs, Object rhs) {
				File file1 = (File) lhs;
				File file2 = (File) rhs;

				int ch1 = file1.getName().charAt(0) - '0';
				int ch2 = file2.getName().charAt(0) - '0';
				int flag = ch1 - ch2;
				LogUtil.i(TAG, "flag is " + flag);
				return flag;
			}
		};
		Collections.sort(fileList, comparator);
		return fileList;
	}

	/**
	 * 
	 * @Description 对codefiles集合排序
	 * @author Administrator
	 * @param codeFiles
	 * @return
	 */
	public List<CodeFile> sort(List<CodeFile> codeFiles) {

		Comparator<Object> comparator = new Comparator<Object>() {

			@Override
			public int compare(Object lhs, Object rhs) {
				CodeFile codeFile1 = (CodeFile) lhs;
				CodeFile codeFile2 = (CodeFile) rhs;

				int ch1 = codeFile1.getName().charAt(0) - '0';
				int ch2 = codeFile2.getName().charAt(0) - '0';
				int flag = ch1 - ch2;
				LogUtil.i(TAG, "flag is " + flag);
				return flag;
			}
		};
		Collections.sort(codeFiles, comparator);
		return codeFiles;
	}

	/**
	 * 
	 * @Description 刷新本地文件列表
	 * @author Administrator
	 */
	// public void refreshLocalData() {
	// // 读取sdcard中的文件信息
	// String path = Environment.getExternalStorageDirectory()
	// .getAbsolutePath() + Constants.ICODE_ROOT_PATH + "/code/";
	// File[] fileTypes = FileUtil.getFiles(path);
	// String type = "";// 根据文件夹的名字确定文件类型
	// List<CodeFile> localCodeFiles = new ArrayList<CodeFile>();
	// if (fileTypes != null) {
	// List<CodeFile> codeFiles = null;
	// for (int i = 0; i < fileTypes.length; i++) {
	// type = fileTypes[i].getName();
	// LogUtil.i(TAG, "文件类型：" + type);
	// codeFiles = readFilesToCodeFiles(
	// FileUtil.getFiles(Constants.CODE_ROOT_DIR + type), type);
	// localCodeFiles.addAll(codeFiles);
	// }
	// }
	// user.setLocalData(localCodeFiles);
	// }

	public void refreshLocalData() {
		// 读取sdcard中的文件信息
		String path = Constants.CODE_LOCAL_DIR;
		File[] files = FileUtil.getFiles(path);
		if(files == null){
			File file = new File(path);
			FileUtil.createDir(file);
			files = FileUtil.getFiles(path);
		}
		List<File> fileList = new ArrayList<File>();
		for (File file : files) {
			fileList.add(file);
		}

		List<CodeFile> codeFiles = new ArrayList<CodeFile>();
		List<CodeFile> codefilesC = new ArrayList<CodeFile>();
		List<CodeFile> codeFilesCpp = new ArrayList<CodeFile>();
		List<CodeFile> codeFilesJava = new ArrayList<CodeFile>();
		List<CodeFile> codeFilesOther = new ArrayList<CodeFile>();
		for (File file : fileList) {
			CodeFile codeFile = new CodeFile();
			codeFile.setId("");
			codeFile.setName(file.getName());
			codeFile.setDetail("");
			codeFile.setPath(Constants.CODE_LOCAL_DIR + file.getName());
			if (file.getName().endsWith(Constants.SUFFIX_C)) {
				codeFile.setType(Constants.TYPE_C);
				codefilesC.add(codeFile);
			} else if (file.getName().endsWith(Constants.SUFFIX_CPP)) {
				codeFile.setType(Constants.TYPE_CPP);
				codeFilesCpp.add(codeFile);
			} else if (file.getName().endsWith(Constants.SUFFIX_JAVA)) {
				codeFile.setType(Constants.TYPE_JAVA);
				codeFilesJava.add(codeFile);
			} else {
				codeFile.setType(Constants.TYPE_OTHER);
				codeFilesOther.add(codeFile);
			}
		}

		// 排序
		codefilesC = sort(codefilesC);
		codeFilesCpp = sort(codeFilesCpp);
		codeFilesJava = sort(codeFilesJava);

		// 设置文件序号
		setFileOrderNum(codefilesC);
		setFileOrderNum(codeFilesCpp);
		setFileOrderNum(codeFilesJava);

		// 添加到同一个集合中
		codeFiles.addAll(codefilesC);
		codeFiles.addAll(codeFilesCpp);
		codeFiles.addAll(codeFilesJava);

		user.setLocalData(codeFiles);
	}

	public void refreshSeverData(){
		String username = AppConfigManager.getInstance().getUsername();
		String password = AppConfigManager.getInstance().getPassword();
		String result = null;
		
		Map<String, String> params = new HashMap<String, String>();
		params.put("userinfo", username);
		params.put("password", password);
		HttpResponse response = HttpURLTools.sendHttpPost(Constants.LOGIN_URL,
				params);
		if (response != null) {
			try {
				result = EntityUtils.toString(response.getEntity());
				LogUtil.i(TAG, "login up result is " + result);
				if ((Constants.SERVER_FAIL + "").equals(result)) {
					return ;
				}
			} catch (ParseException | IOException e) {
				e.printStackTrace();
			}
		} else {
			LogUtil.i(TAG, "response is null");
			return ;
		}

		// 保存登录信息
		AppConfigManager.getInstance().setPassword(password);
		AppConfigManager.getInstance().setUsername(username);
		refreshSeverData(result);
	}
	
	/**
	 * 
	 * @Description 刷新服务器文件列表
	 * @author Administrator
	 * @param userInfo
	 */
	private void refreshSeverData(String userInfo) {
		List<CodeFile> codeFiles = new ArrayList<CodeFile>();

		// 解析userInfo JSON字符串
		try {
			JSONObject userJsonObject = new JSONObject(userInfo);
			user.setId(userJsonObject.getString("id"));
			user.setName(userJsonObject.getString("name"));
			user.setPassword(userJsonObject.getString("password"));
			user.setPhone(userJsonObject.getString("phone"));
			LogUtil.i("gg", "id is " + user.getId());
			LogUtil.i("gg", "name is " + user.getName());
			LogUtil.i("gg", "password is " + user.getPassword());
			LogUtil.i("gg", "phone is " + user.getPhone());
			JSONArray fileNameArray = userJsonObject.getJSONArray("filenames");
			List<CodeFile> codefilesC = new ArrayList<CodeFile>();
			List<CodeFile> codeFilesCpp = new ArrayList<CodeFile>();
			List<CodeFile> codeFilesJava = new ArrayList<CodeFile>();
			List<CodeFile> codeFilesOther = new ArrayList<CodeFile>();
			LogUtil.i("gg", "fileNameArray length is " + fileNameArray.length());
			FileUtil.createDir(new File(Constants.CODE_SERVER_DIR)); // 创建 /server/ 文件夹
			for (int i = 0; i < fileNameArray.length(); i++) {
				CodeFile codeFile = new CodeFile();
				codeFile.setId("");
				codeFile.setName(fileNameArray.getString(i));
				codeFile.setDetail("");
				codeFile.setPath(Constants.CODE_SERVER_DIR + fileNameArray.getString(i));
				if (fileNameArray.getString(i).endsWith(Constants.SUFFIX_C)) {
					codeFile.setType(Constants.TYPE_C);
					codefilesC.add(codeFile);
				} else if (fileNameArray.getString(i).endsWith(Constants.SUFFIX_CPP)) {
					codeFile.setType(Constants.TYPE_CPP);
					codeFilesCpp.add(codeFile);
				} else if (fileNameArray.getString(i).endsWith(Constants.SUFFIX_JAVA)) {
					codeFile.setType(Constants.TYPE_JAVA);
					codeFilesJava.add(codeFile);
				} else {
					codeFile.setType(Constants.TYPE_OTHER);
					codeFilesOther.add(codeFile);
				}
			}
			
			// 排序
			codefilesC = sort(codefilesC);
			codeFilesCpp = sort(codeFilesCpp);
			codeFilesJava = sort(codeFilesJava);

			// 设置文件序号
			setFileOrderNum(codefilesC);
			setFileOrderNum(codeFilesCpp);
			setFileOrderNum(codeFilesJava);

			// 添加到同一个集合中
			codeFiles.addAll(codefilesC);
			codeFiles.addAll(codeFilesCpp);
			codeFiles.addAll(codeFilesJava);

		} catch (JSONException e) {
			e.printStackTrace();
		}

		user.setServerData(codeFiles);
	}

	public void setFileOrderNum(List<CodeFile> codeFiles) {
		for (int i = 0; i < codeFiles.size(); i++) {
			codeFiles.get(i).setOrderNumber(i);
		}
	}

}
